﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Helena.Areas.Productos.Models;
using Telerik.Web.Mvc;
using Helena.Areas.Categorias.Models;
using Helena.Areas.Campanas.Models;
using Helena.Areas.Configuraciones.Models;
using System.Threading;
using Helena.Areas.Vendedores.Models;
using Helena.Areas.Ventas.Models;
using Helena.Areas.Clientes.Models;
using Helena.Areas.Reportes.Models;
using Helena.Models;

namespace Helena.Areas.Ventas.Controllers
{
    public class VentaController : Controller
    {
        LogicaVenta db = new LogicaVenta();
        LogicaProducto pro_db = new LogicaProducto();
        LogicaConfiguraciones conf_db = new LogicaConfiguraciones();
        LogicaCliente cli_db = new LogicaCliente();
        LogicaTarjeta tar_db = new LogicaTarjeta();
        LogicaKardex kardex = new LogicaKardex();

        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Index()
        {
            VendedorView vw = (VendedorView)Session["Vendedor"];
            if (vw.ID != 0)
            {
                return View();
            }
            else
            {
                return Redirect("../Home/NoSession");
            }
        }

        #region Comprobante
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult VentaTicket()
        {
            VentaView venta = (VentaView)Session["NuevaVenta"];
            venta.Ticket = db.RetornarNextTicket();
            Session["clientes"] = cli_db.i_RetornarClientes();
            Session["Tarjetas"] = tar_db.i_RetornarTarjetas();
            Session["Configuracion"] = conf_db.ObtenerUltimaConfiguracion();

            List<VendedorView> salida = new List<VendedorView>();

            salida.Add((VendedorView)Session["Vendedor"]);
            Session["vendedores"] = salida;
            return View(venta);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult VentaTicket(VentaView venta)
        {
            if ((venta.Pago_con_Tarjeta_en_Soles == 0) && (venta.Pago_en_Efectivo_en_Dolares == 0) && (venta.Pago_en_Efectivo_en_Soles  == 0))
            {
                VentaView sventa = (VentaView)Session["NuevaVenta"];
                sventa.Ticket = db.RetornarNextTicket();
                return View(sventa);
            }
            else
            {
                VentaView imprimir = ObtenerVenta(venta);

                IngresarDetallesDeVenta(imprimir, (List<DetalleVentaView>)Session["Detalle"]);

                Session["NuevaVenta"] = null;
                Session["Detalle"] = null;

                Util.ImprimirVenta(imprimir);

                return RedirectToAction("Index", "DetalleVenta");
            }
        }

        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult VentaTicketFactura()
        {
            VentaView venta = (VentaView)Session["NuevaVenta"];
            venta.Ticket = db.RetornarNextTicket();
            Session["clientes"] = cli_db.i_RetornarClientes();
            Session["Tarjetas"] = tar_db.i_RetornarTarjetas();
            Session["Configuracion"] = conf_db.ObtenerUltimaConfiguracion();

            List<VendedorView> salida = new List<VendedorView>();

            salida.Add((VendedorView)Session["Vendedor"]);
            Session["vendedores"] = salida;
            return View(venta);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult VentaTicketFactura(VentaView venta)
        {
            if ((venta.Pago_con_Tarjeta_en_Soles == 0) && (venta.Pago_en_Efectivo_en_Dolares == 0) && (venta.Pago_en_Efectivo_en_Soles  == 0))
            {
                VentaView sventa = (VentaView)Session["NuevaVenta"];
                sventa.Ticket = db.RetornarNextTicket();
                return View(sventa);
            }
            else
            {
                VentaView imprimir = ObtenerVenta(venta);

                IngresarDetallesDeVenta(imprimir, (List<DetalleVentaView>)Session["Detalle"]);

                Session["NuevaVenta"] = null;
                Session["Detalle"] = null;

                Util.ImprimirVenta(imprimir);
                Util.ImprimirVenta(imprimir);

                return RedirectToAction("Index", "DetalleVenta");
            }
        }
        
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult VentaBoleta()
        {
            VentaView venta = (VentaView)Session["NuevaVenta"];
            venta.Boleta = db.RetornarNextBoleta();
            Session["clientes"] = cli_db.i_RetornarClientes();
            Session["Tarjetas"] = tar_db.i_RetornarTarjetas();
            Session["Configuracion"] = conf_db.ObtenerUltimaConfiguracion();

            List<VendedorView> salida = new List<VendedorView>();
            salida.Add((VendedorView)Session["Vendedor"]);
            Session["vendedores"] = salida;
            return View(venta);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult VentaBoleta(VentaView venta)
        {
            if ((venta.Pago_con_Tarjeta_en_Soles == 0) && (venta.Pago_en_Efectivo_en_Dolares == 0) && (venta.Pago_en_Efectivo_en_Soles == 0))
            {
                VentaView sventa = (VentaView)Session["NuevaVenta"];
                sventa.Boleta = db.RetornarNextBoleta();
                return View(sventa);
            }
            else
            {
                VentaView imprimir = ObtenerVenta(venta);

                IngresarDetallesDeVenta(imprimir, (List<DetalleVentaView>)Session["Detalle"]);

                Session["NuevaVenta"] = null;
                Session["Detalle"] = null;
                return RedirectToAction("Index","DetalleVenta");
            }
        }

        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult VentaFactura()
        {
            VentaView venta = (VentaView)Session["NuevaVenta"];
            venta.Factura = db.RetornarNextFactura();
            Session["clientes"] = cli_db.i_RetornarClientes();
            Session["Tarjetas"] = tar_db.i_RetornarTarjetas();
            Session["Configuracion"] = conf_db.ObtenerUltimaConfiguracion();

            List<VendedorView> salida = new List<VendedorView>();
            salida.Add((VendedorView)Session["Vendedor"]);
            Session["vendedores"] = salida;
            return View(venta);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult VentaFactura(VentaView venta)
        {
            if ((venta.Pago_con_Tarjeta_en_Soles == 0) && (venta.Pago_en_Efectivo_en_Dolares == 0) && (venta.Pago_en_Efectivo_en_Soles == 0))
            {
                VentaView sventa = (VentaView)Session["NuevaVenta"];
                sventa.Factura = db.RetornarNextFactura();
                return View(sventa);
            }
            else
            {
                VentaView imprimir = ObtenerVenta(venta);

                IngresarDetallesDeVenta(imprimir, (List<DetalleVentaView>)Session["Detalle"]);

                Session["NuevaVenta"] = null;
                Session["Detalle"] = null;

               return RedirectToAction("Index", "DetalleVenta");
            }
        }

        #endregion

        #region Almacenar

        public VentaView ObtenerVenta(VentaView venta)
        {

            VentaView Almacenada = (VentaView)Session["NuevaVenta"];
            Almacenada.ID = 0;
            //Permite cambiar el numerero de comprobante
            Almacenada.Boleta = venta.Boleta;
            Almacenada.Factura = venta.Factura;
            Almacenada.Ticket = venta.Ticket;
            
            Almacenada.Descuento = venta.Descuento;
            Almacenada.Sub_Total = venta.Sub_Total;
            Almacenada.Total_En_Soles = venta.Total_En_Soles;
            Almacenada.Total_En_Dolares = Math.Round(venta.Total_En_Soles * Convert.ToDecimal(1 / 1.18), 2);
            Almacenada.Valor_Del_Igv_En_Soles = Math.Round(venta.Total_En_Soles * Convert.ToDecimal(0.18 / 1.18), 2);

            Almacenada.Pago_en_Efectivo_en_Soles = venta.Pago_en_Efectivo_en_Soles;
            Almacenada.Pago_en_Efectivo_en_Dolares = venta.Pago_en_Efectivo_en_Dolares;
            Almacenada.Pago_con_Tarjeta_en_Soles = venta.Pago_con_Tarjeta_en_Soles;
            
            if (venta.tarjetaID != 0)
            {
                Almacenada.tarjetaID = venta.tarjetaID;
            }            
            Almacenada.Vuelto = venta.Vuelto;
            Almacenada.ID = db.i_AgregarVenta(Almacenada);
            Almacenada.ClienteID = venta.ClienteID;

            return Almacenada;
        }

        public void IngresarDetallesDeVenta(VentaView v, List<DetalleVentaView> detalles)
        {
            foreach (DetalleVentaView d in detalles)
            {
                // por cada detalle de venta se realiza la actualizacion de
                    //Venta
                    //Producto
                    //Kardex
                //Ingresa la venta del producto simple o compuesto
                ProductoView p = pro_db.i_RetornarProducto(d.ProductoID);
                
                d.VentaID = v.ID; // el detalle se linkea a una venta
                d.ID=0;
                // aca no hay movimiento de stock
                // se ingresa el kardex x el stock inicial
                kardex.IngresarVenta(p, d.Cantidad, DateTime.Now);

                //Se actualiza los productos
                db.AgregarDetalleaVenta(v.ID, d);
            }
        }
        #endregion

    }
}